/**
 * @file roadblock.c
 * @author sevenfite (sevenfite@163.com)
 * @brief 路障方法
 * @version 0.1
 * @date 2024-01-09
 *
 * @copyright Copyright (c) 2024
 *
 * @note 通过改变巡线方法和特定动作来实现路障方法
 */
#include "roadblock.h"

#include "C_code_Log.h"
#include "control.h"
#include "findline.h"
#include "motor.h"
#include "pid.h"
/*

* 函数介绍：过台阶方法
* 输入参数：无
* 输出参数：无
* 返回值  ：1(路障解决)0（路障未解决）
* 其他		：无
* 作者    ：@袁梓聪

*/
static uint8_t BlockHandleMethod_Step() {
  static uint8_t flag = 0;
  static FindLine save;
  LOG("INFO", "BlockHandleMethod_Step");
  return 1;
}
static uint8_t BlockHandleMethod_Bridge() {
  static uint8_t flag = 0;
  static FindLine save;
  flag++;
  if (flag == 1) {
    save = gl_controlCenter.findLineWay;
    gl_controlCenter.findLineWay = FL_bridge;
  }
  LOG("INFO", "BlockHandleMethod_Bridge");
  if (flag > 5) {
    flag = 0;
    gl_controlCenter.findLineWay = save;
    return 1;
  }
  return 0;
}

static uint8_t BlockHandleMethod_Door() {
  changeRunMethodTable(&gl_controlCenter, mapInfo, runMethodTable[2]);
  LOG("INFO", "changeRunMethodTable");
  return 1;
}

/// @brief 路障任务回调函数
/// @param control 控制台
/// @note
/// 在完成路障任务后调用，将路障任务状态设置为完成，将加速任务状态置为准备就绪
static void roadBlocksCallback(ControlCenterTypeDef *control) {
  control->runState->F_RoadBlockState = MY_EXIT;
  control->runState->speedUpState = MY_READY;
}

/// @brief 路障任务处理函数
/// @param control 控制台
/// @note 在路障任务状态为准备就绪时调用，根据路障任务的类型执行不同的路障任务
/// @note 路障处理完成后调用路障任务回调函数
void roadBlocksHandle_Task(ControlCenterTypeDef *control) {
  // 如果路障任务状态为准备就绪
  if (control->runState->F_RoadBlockState == MY_READY) {
    // 根据路障任务的类型执行不同的路障任务，sectionInfo是当前路段的信息的指针，指向地图
    switch (control->sectionInfo->roadBlockWay) {
      case FREE:
        roadBlocksCallback(control);
        break;
      case BRIDGE:
        if (1 == BlockHandleMethod_Bridge()) {
          roadBlocksCallback(control);
        }
        break;
      case STEP:
        if (1 == BlockHandleMethod_Step()) {
          roadBlocksCallback(control);
        }
        break;
      case DOOR:
        if (1 == BlockHandleMethod_Door()) {
          //如果路障任务状态为准备就绪,即没有切换路线
          if (control->runState->F_RoadBlockState == MY_READY) {
            roadBlocksCallback(control);
          }
        }
        break;
      default:
        roadBlocksCallback(control);
        break;
    }
  }
}
